'''
Created on 18/04/2012

@author: rcasal
'''
# -*- coding: utf-8 -*-

T.force('es-es')

import json
import datetime
from domain.entities.consulta import Consulta
from domain.entities.comunicacion import Comunicacion, Condicion
from domain.entities.afiliado import Afiliado
from domain.entities.establecimiento import Establecimiento
from domain.entities.tipodocumento import TipoDocumento
from domain.entities.mail import Mail, MailBandejaEntrada, MailConsulta, MailRespuesta
from domain.forms.sqlforms import FormFactory
from domain.mailer.mailer import Mailer


if 0:
    None
    import gluon
    import gluon.languages.translator as T
    from gluon.html import A, DIV, TABLE, TR, TD, SELECT, OPTION, XML, URL
    global redirect; redirect = gluon.globals.redirect()
    global response; response = gluon.globals.Response()
    global request; request = gluon.globals.Request()
    global service; service = gluon.tools.Service()
    global crud; crud = gluon.tools.Crud()
    global local_import; local_import = gluon.compileapp.local_import_aux
    global session; session = gluon.globals.Session()
    from repositories.sigecon.comunicacion import ComunicacionRepository as comunicaciones
    from repositories.sigecon.comunicacion import ModalidadRepository as modalidades
    from repositories.sigecon.comunicacion import CondicionRepository as condiciones
    from repositories.sigecon.consulta import ConsultaRepository as consultas
    from repositories.sigecon.usuario import SectorRepository as sectores
    from repositories.sigecon.usuario import AuthRepository as auth
    from repositories.sigecon.consulta import TipoConsultaRepository as tipos
    from repositories.sigecon.consulta import SubtipoConsultaRepository as subtipos
    from repositories.sigecon.consulta import RespuestaRepository as respuestas
    from repositories.sigecon.mails import BandejaEntradaRepository as bandeja_mails    
    from repositories.sigecon.mails import MailConsultaRepository as mails_consulta    
    from repositories.sigecon.mails import MailRespuestaRepository as mails_respuesta   

    from repositories.comunes.domicilio import LocalidadRepository as localidades
    from repositories.comunes.tipodocumento import TipoDocumentoRepository as tipos_doc
    from repositories.afiliaciones.afiliado import AfiliadoRepository as afiliados
    from repositories.afiliaciones.establecimiento import EstablecimientoCabeceraRepository as establecimientos


def buscar_empleador_por_cuit():
    cuit = request.vars['cuit']
    establecimiento = Establecimiento
    establecimiento = establecimientos.findByCuit(cuit)
    diccionario = dict(error = "null")
    if establecimiento:
        diccionario = dict(error = "",
                           razon_social = establecimiento.razonsocial,
                           cuit = establecimiento.cuit)
    return json.JSONEncoder().encode(diccionario)

  
def check_afiliado_por_tipo_nro_doc():
    tipo_documento = request.vars['tipo_documento']
    nro_documento = request.vars['nro_documento']
    if tipo_documento == "" or nro_documento == "":
        return "{error: 'Ingresar tipo y nro de documento'}"
    res_afiliados = afiliados.findByTipoDocAndNroDoc(tipo_documento, nro_documento)
    if len(res_afiliados) == 0:
        return "{error: 'Afiliado no encontrado'}"
    afiliado = Afiliado()
    tipodoc = TipoDocumento()
    if len(res_afiliados) > 1:
        res = "{error: 'Mas de un afiliado encontrado', afiliados:["
        for af in afiliados:
            afiliado = af
            tipodoc = tipos_doc.findOne(afiliado.tipodoc.ID)
            afiliado.tipodoc = tipodoc
            res = res + "{nombre: '%s', apellido:'%s', tipo_documento: '%s', nro_documento: '%s', cuil:'%s'}," %(afiliado.nombres, afiliado.apellido, afiliado.tipodoc.codigo, afiliado.nrodoc, afiliado.cuil)
        res = res + "]}"
        return  res
    afiliado = res_afiliados[0]
    tipodoc = tipos_doc.findOne(afiliado.tipodoc.ID)
    afiliado.tipodoc = tipodoc
    return "{error: '', nombre: '%s', apellido: '%s', tipo_documento: '%s', nro_documento: '%s', cuil: '%s'}" %(afiliado.nombres, afiliado.apellido, afiliado.tipodoc.codigo, afiliado.nrodoc, afiliado.cuil)

  
def buscar_afiliado_por_cuil():
    cuil = request.vars['cuil']
    if cuil == "" or cuil == None:
        raise Exception("no cuil")
    afiliado = Afiliado()
    afiliado = afiliados.findByCuil(cuil)
    tipodoc = TipoDocumento()
    tipodoc = tipos_doc.findOne(afiliado.tipodoc.ID)
    afiliado.tipodoc = tipodoc
    return "{nombre: '%s', apellido: '%s', tipo_documento: '%s', nro_documento: '%s', cuil: '%s', plan: '%s', fecha_baja: '%s', motivo_baja: '%s'}" %(afiliado.nombres, afiliado.apellido, afiliado.tipodoc.codigo, afiliado.nrodoc, afiliado.cuil, afiliado.plan.nombre, afiliado.plan.baja.fecha, afiliado.plan.baja.motivo)
 
def add_ajax(form):
    condicion_onchange = form.element(_name='condicion')
    condicion_onchange['_onchange'] = XML("ajax('" + URL(r=request, c = 'combos', f='select_consultas_por_condicion') + "', ['condicion'], 'div_no_table_consulta__row');ajax('" + URL(r=request, c = 'combos', f='select_subconsultas_por_consulta') + "', ['consulta'], 'div_no_table_subconsulta__row');ajax('" + URL(r=request, c = 'combos', f='select_respuestas_por_subconsulta') + "', ['subconsulta'], 'div_no_table_respuesta__row'); ajax('" + URL(r=request, c = 'combos', f='select_sectores_por_respuesta') +"', ['respuesta'], 'div_no_table_sector__row')")

    consultas_onchange = form.element(_name='consulta')
    consultas_onchange['_onchange'] = XML("ajax('" + URL(r=request, c = 'combos', f='select_subconsultas_por_consulta') + "', ['consulta'], 'div_no_table_subconsulta__row');ajax('" + URL(r=request, c = 'combos', f='select_respuestas_por_subconsulta') + "', ['subconsulta'], 'div_no_table_respuesta__row')")
    
    subconsulta_onchange = form.element(_name='subconsulta')
    subconsulta_onchange['_onchange'] = XML("ajax('" + URL(r=request, c = 'combos', f='select_respuestas_por_subconsulta') + "', ['subconsulta'], 'div_no_table_respuesta__row'); ajax('" + URL(r=request, c = 'combos', f='select_sectores_por_respuesta') + "', ['respuesta'], 'div_no_table_sector__row')")
    
    respuesta_onchange = form.element(_name='respuesta')
    respuesta_onchange['_onchange'] = XML("ajax('" + URL(r=request, c = 'combos', f='select_sectores_por_respuesta') + "', ['respuesta'], 'div_no_table_sector__row')")
    
    provincia_onchange = form.element(_name='provincia')
    provincia_onchange['_onchange'] = XML("ajax('" + URL(r=request, c = 'combos', f='select_localidades_por_provincia') + "', ['provincia'], 'div_no_table_localidad__row'); ajax('" + URL(r=request, c = 'combos', f='select_barrios_por_localidad') + "', ['localidad'], 'div_no_table_barrio__row')")
    
def inicializar_consultas_con_request_vars(comu, cons):

    comunicacion = Comunicacion
    comunicacion = comu
    consulta = Consulta
    consulta = cons
    
    comunicacion.usuario = auth.get_user()
    comunicacion.nombre = request.vars.nombre
    comunicacion.condicion = condiciones.findOne(request.vars.condicion)
    comunicacion.provincia = provincias.findOne(request.vars.provincia)
    comunicacion.localidad = localidades.findOne(request.vars.localidad)
    comunicacion.barrio = barrios.findOne(request.vars.barrio)
    comunicacion.cuil = request.vars.cuil
    comunicacion.cuit = request.vars.cuit
    comunicacion.genero = request.vars.genero
    
    if comunicacion.localidad:
        comunicacion.departamento.ID = comunicacion.localidad.departamento.ID
        
    comunicacion.telefono = request.vars.telefono
    comunicacion.mail = request.vars.mail
    
    consulta.comunicacion = comunicacion
    consulta.tipo = tipos.findOne(request.vars.consulta)
    consulta.subtipo = subtipos.findOne(request.vars.subconsulta)
    consulta.respuesta = respuestas.findOne(request.vars.respuesta)
    consulta.comentario = request.vars.comentario
    consulta.sector = sectores.findOne(request.vars.sector)
    
    if consulta.respuesta and (consulta.respuesta.codigo == "DERIVADA" or consulta.respuesta.codigo == "PENDIENTE"):
        consulta.finalizado = False
    else:
        consulta.finalizado = True
        
        
def actualizar_form_vars(form, consulta):
    comunicacion = consulta.comunicacion
    condicion = Condicion()
    condicion = condiciones.findOne(comunicacion.condicion.ID)     
    form.vars.finalizado = consulta.finalizado                                
    if condicion.descripcion == 'AFILIADO':
        afiliado = afiliados.findByCuil(comunicacion.cuil)
        print afiliado
        form.vars.nombre = afiliado.nombres + " " + afiliado.apellido
        form.vars.genero = None
        form.vars.cuit = ""
        form.vars.cuil = afiliado.cuil
        form.vars.nro_documento = afiliado.nrodoc
        form.vars.tipo_documento = afiliado.tipodoc.ID
    elif condicion.descripcion == 'EMPLEADOR':
        establec = Establecimiento()
        establec = establecimientos.findByCuit(form.vars.cuit)
        form.vars.nombre = establec.razonsocial
        form.vars.genero = None                
        form.vars.cuit = establec.cuit
        form.vars.cuil = ""
        form.vars.tipo_documento = None
        form.vars.nro_documento = None
    elif condicion.descripcion == 'PRESTADOR':
        form.vars.nombre = comunicacion.nombre
        form.vars.genero = None
        form.vars.tipo_documento = None
        form.vars.nro_documento = None
        form.vars.cuil = ""
    elif condicion.descripcion == 'NO AFILIADO':
        form.vars.nombre = comunicacion.nombre
        form.vars.genero = comunicacion.genero
        form.vars.tipo_documento = None
        form.vars.nro_documento = None
        form.vars.cuil = ""
        form.vars.cuit = ""
    
    
################## COMUNICACION TELEFONICA ###################
@auth.requires_login()  
@auth.requires_membership("TELEFONICA")      
def comunicacion_telefonica():
    comunicacion = Comunicacion()
    consulta = Consulta()
    comunicacion.modalidad = modalidades.findByDescripcion("TELEFONICA")
    inicializar_consultas_con_request_vars(comunicacion, consulta)
    comunicaciones.refresh_requires(comunicacion)
    consultas.refresh_requires(consulta)
    form = FormFactory.carga_comunicacion_consulta(comunicaciones.tabla, consultas.tabla)
    add_ajax(form)
    form.vars.modalidad = comunicacion.modalidad.ID
    form.vars.usuario = comunicacion.usuario.ID
    form.vars.departamento = comunicacion.departamento.ID
    form.vars.comunicacion = consulta.comunicacion.ID
    
    if form.process(dbio=False).accepted:
        actualizar_form_vars(form, consulta)    
        idcom = comunicaciones.save(form.vars)
        form.vars.comunicacion = idcom
        idcon = consultas.save(form.vars)        
        response.flash=DIV(DIV(T('Consulta guardada')), 
                               DIV('Numero: ' + str(idcon)))                   

    else:
        if "cuil" in form.errors:
            response.flash = DIV(DIV("Error al cargar al afiliado"), 
                                 DIV("verifique tipo y nro de documento"))
        if "nombre" in form.errors and comunicacion.condicion.descripcion == "EMPLEADOR":
            response.flash = DIV(DIV("Error al cargar al empleador"), 
                                 DIV("verifique cuit"))
            
            
    return dict(title = T("Comunicacion telefonica"), form = form, form_error = form.errors)


################## COMUNICACION PERSONAL ###################

@auth.requires_login()  
@auth.requires_membership("PERSONAL")       
def comunicacion_personal():
    comunicacion = Comunicacion()
    consulta = Consulta()
    comunicacion.modalidad = modalidades.findByDescripcion("PERSONAL")
    inicializar_consultas_con_request_vars(comunicacion, consulta)
    comunicaciones.refresh_requires(comunicacion)
    consultas.refresh_requires(consulta)
    form = FormFactory.carga_comunicacion_consulta(comunicaciones.tabla, consultas.tabla)
    add_ajax(form)
    form.vars.modalidad = comunicacion.modalidad.ID
    form.vars.usuario = comunicacion.usuario.ID
    form.vars.departamento = comunicacion.departamento.ID
    form.vars.comunicacion = consulta.comunicacion.ID
    
    if form.process(dbio=False).accepted:
        try:
            actualizar_form_vars(form, consulta)    
            idcom = comunicaciones.save(form.vars)
            form.vars.comunicacion = idcom
            idcon = consultas.save(form.vars)        
            response.flash=DIV(DIV(T('Consulta guardada')), 
                               DIV('Numero: ' + str(idcon)))                   
        except Exception as inst:
            session.flash= inst.args
            raise inst
    else:
        if "cuil" in form.errors:
            response.flash = DIV(DIV("Error al cargar al afiliado"), 
                                 DIV("verifique tipo y nro de documento"))
        if "nombre" in form.errors and comunicacion.condicion.descripcion == "EMPLEADOR":
            response.flash = DIV(DIV("Error al cargar al empleador"), 
                                 DIV("verifique cuit"))
            
            
    return dict(title = "Comunicacion personal", form = form, form_error = form.errors)

################## COMUNICACION MAIL ###################

@auth.requires_login()  
@auth.requires_membership("MAIL")      
def comunicacion_mail():
    
    if len(request.args) == 0:
        session.flash = DIV(
            DIV("No se pudo redirigir correctamente a 'comunicacion_mail'"),
            DIV("No se encuentra el id bandeja")
        )
        redirect(URL(r = request, c = 'errors', f = 'attention'))
        
    id_mail_bandeja = request.args[0]
    mail = MailBandejaEntrada
    mail = bandeja_mails.findOne(id_mail_bandeja)
    direccion = mail.From
    comunicacion = Comunicacion()
    consulta = Consulta()
    comunicacion.modalidad = modalidades.findByDescripcion("MAIL")
    inicializar_consultas_con_request_vars(comunicacion, consulta)
    comunicaciones.refresh_requires(comunicacion)
    consultas.refresh_requires(consulta)
    form = FormFactory.carga_comunicacion_consulta(comunicaciones.tabla, consultas.tabla)
    add_ajax(form)
    form.vars.modalidad = comunicacion.modalidad.ID
    form.vars.usuario = comunicacion.usuario.ID
    form.vars.departamento = comunicacion.departamento.ID
    form.vars.comunicacion = consulta.comunicacion.ID
    
    if form.process(dbio=False).accepted:
        try:
            actualizar_form_vars(form, consulta)     
            idcom = comunicaciones.save(form.vars)
            form.vars.comunicacion = idcom
            idcon = consultas.save(form.vars)
            mail.Leido = True
            mail.Fecha_Leido = datetime.datetime.now()
            bandeja_mails.update(mail)
            entity = MailConsulta(idcon, mail.Account, mail.ID_mail, mail.From, mail.To, mail.Subject, mail.Fecha, mail.Fecha_Leido, mail.Text)
            idmail = mails_consulta.save(entity)        
            session.flash=DIV(DIV(T('Consulta guardada')), 
                                   DIV('Estado: finalizada'),
                                   DIV('Numero: ' + str(idcon)),
                                   DIV('Debe enviar una respuesta'))
            redirect(URL(request.application, 'correo', 'correo_responder_mail', args = [idmail]))

                             
        except NotImplementedError as inst: #lo dejo asi, porque sino no muestar todo el error
            session.flash= inst.args
            raise inst
    else:
        if "cuil" in form.errors:
            response.flash = DIV(DIV("Error al cargar al afiliado"), 
                                 DIV("verifique tipo y nro de documento"))
        if "nombre" in form.errors and comunicacion.condicion.descripcion == "EMPLEADOR":
            response.flash = DIV(DIV("Error al cargar al empleador"), 
                                 DIV("verifique cuit"))
            
    return dict(title = T("Comunicacion mail"), form = form, id_mail_bandeja = id_mail_bandeja, direccion = direccion, form_error = form.errors)
